Chapter 2 Context Free Language
上下文无关文法 CFG 是四元组
- 对于任意
,如果 ,那么 。拓展到 是至多有限次推导 接受语言 ,当且仅当 - 最左推导:对于推导中的某一个中间态
,下一步展开的必然是第一个满足 的变量字符,则称该推导为最左推导。注意这里并没有限制 = 1。 - 歧义:字符串
在 中存在不少于两个的最左推导。歧义一定来自于最左推导中的某个
Chomsky 范式(Chomsky Norm Form)要求
- 证明所有 CFG 都可以化为 Chomsky 范式就是证明其他规则是可以化归到这两个基本规则(以下
) :引入 , 作为新的开始变量。 (消除):该规则只会影响到所有形如 的规则,只需要在上游对应添加 。 (改名):该规则只会影响到所有形如 的规则,只需要在上游对应添加 。 (长规则):该规则可以直接拆分为 。
下推自动机 PDA(Push Down Automata) 是一个六元组
- 相对于 NFA 而言多了一个栈结构,每一状态转移可以读取栈顶信息并可选的写栈和弹栈。表达历史信息的能力从 "只能纯用状态本身来刻画" 提升到了 "可以用一个栈结构来刻画"
- PDA
接受字符串 当且仅当存在状态序列和栈序列 满足
PDA 和 CFG 的等价性
- CFG
到 PDA : - 考虑 CFG 的 Chomsky 范式(实际上不考虑 Chomsky 范式也可以),用 PDA 的栈结构来刻画其展开过程,初始栈为
( 用来标识栈底),PDA 可以不处理输入地用栈模拟 CFG 的每一条最左推导,一旦 CFG 推导出终结变量字符,那么吃掉出入中的对应终结变量字符。 - 同时压栈多个字符可以用中间状态实现。
- 转移包括初始化
,模拟中间符号推导 , ,匹配终结变量和输入 。最终接受空栈 表示输入完全符合某一条 CFG 分支生成的字符串。
- 考虑 CFG 的 Chomsky 范式(实际上不考虑 Chomsky 范式也可以),用 PDA 的栈结构来刻画其展开过程,初始栈为
- PDA
到 CFG: - 规范化
为唯一终止状态 。 - 对于
定义 为所有使得 可以从 转移到 ,并保持栈前后相同,且任意中间栈状态不能少于开始栈状态(这一点要求在该 是由 按照我们下面定义的分割规则得到的时是自动成立的)的字符串。 - 对于
,任意状态 都有 - 对于
,如果不存在 使得 ,那么必然存在 有
- 对于
- 构造:
, 是所有的 ,构造的规则包括 , , 。 - 上述构造的正确性基于
等价于 在 状态读取 会到达 状态且保持栈前后不变。
- 规范化
一个语言是上下文无关语言 CFL 当且仅当存在某个 PDA 识别它或者它被某个上下文无关文法描述
由于 FDA 是没有栈的 PDA,所以正则语言是上下文无关语言的一个真子集